import processing.core.*;

/**
 * @author Tiina, Chris, Lauri
 *
 * Luokka, joka kuvaa valoa ja sen liikkumista kartalla.
 */
public class Valo {
	private PImage img;
	private float range;
	private float kohta;
	private UserInterface p;
	private int kk;
	private float kal;

	public Valo(UserInterface parent) {
		this.p = parent;
		img = p.loadImage( "map4.jpg" );
		range = img.width-250;
		kk = PApplet.month();
		kal = kal(); //Lasketaan valon kallistuskerroin
	}
	
	
	/*Lasketaan kohta, jossa valo on parametrina annettuun aikaan.*/
	public float aikaKohdaksi(float aika)
	{
		float apu = (1440-2*aika)/1440;
		float vast = (apu)*img.width + img.width/2;
		return vast;
	}
	
	
	//Lasketaan kuukauden mukaan, kuinka paljon valovyöhykettä kallistetaan
	public float kal()
	{
		float vast = 100;
		switch(kk) {
		case 1: 	vast = -5; 	break;
		case 2: 	vast = -10; break;
		case 3: 	vast = 1000;break;
		case 4: 	vast = 10; 	break;
		case 5: 	vast = 5; 	break;
		case 6: 	vast = 1; 	break;
		case 7: 	vast = 5; 	break;
		case 8: 	vast = 10;	break;
		case 9: 	vast = 1000;break;
		case 10: 	vast = -10;	break;
		case 11: 	vast = -5;	break;
		case 12: 	vast = -1; 	break;
		}
		return vast;
	}

	/*Piirretään valoisuusvyöhykettä.*/
	public void draw() {

		p.imageMode(PApplet.CENTER);
		p.loadPixels();
		
		//Jokainen kartan pikseli käydään läpi.
		for (int x = 0; x < img.width; x++ ) {
			float kohta2 = kohta-2*img.width;
			for (int y = 0; y < img.height; y++ ) {

				//Lasketaan 1D-pikselipaikka
				int loc = x + y*img.width;

				//Otetaan kuvasta RGB-arvo
				float r = p.red (img.pixels[loc]);
				float g = p.green (img.pixels[loc]);
				float b = p.blue (img.pixels[loc]);

				//Valoisuusakseleita on 2, toinen tulee kuvaan sitä mukaa kuin toinen lähtee.
				
				float distance = PApplet.dist(x,y,kohta,y);
				
				//Katsotaan, kumpi akseleista (kohta vai kohta2) on lähempänä.
				if(PApplet.dist(x,y,kohta,y)>PApplet.dist(x,y,kohta2,y))
				{
					distance = PApplet.dist(x,y,kohta2,y);
				}
				
				float kallistus = (y-img.height)/kal;
				distance += kallistus; //Valovyöhykkeen kallistus

				/* Näin menee valoisuudet:
				 * esimerkki 		(pimeä \ valo / pimeä)
                -suomen kesällä  	( \ / )
                -kevätjasyksy   	( | | )
	      		-talvella       	( / \ )
				 */
				
				//Säädetään kirkkautta
				double adjustBrightness = (range-distance)/range;
				if(adjustBrightness<0.2) adjustBrightness = 0.2;
				r *= adjustBrightness;
				g *= adjustBrightness;
				b *= adjustBrightness;

				//RGB välille 0-255
				r = PApplet.constrain(r,0,255);
				g = PApplet.constrain(g,0,255);
				b = PApplet.constrain(b,0,255);

				//Luodaan uusi väri ja asetetaan pikseli ikkunaan
				int kloc = loc+25+25*img.width+y*50;
				
				//Kloc siirtää kuvaa pois reunasta
				p.pixels[kloc] = p.color(r,g,b);
				


			}
		}
		
		//Lasketaan, mihin kohtaan kohta laitetaan
		kohta = aikaKohdaksi(p.annaMin());
		
		//Siirretään kohta takasin oikealle, jotta valoa näkyy molemmissa laidoissa
		if(kohta < (img.width/2)) kohta += 2*img.width;
		p.updatePixels();
	}

}